#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
const int N=2*1e5+10;

unordered_map<int,int> has;
int f[N],idx;
struct node{
	int x,y;
	int flg;
};

int t,n;
int _get(int x)
{
	if(!has.count(x))
		has[x]=++idx;
	return has[x];
}
int Find(int x)
{
	if(f[x]!=x)
	{
		f[x]=Find(f[x]);
	}
	return f[x];
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		vector<node> arr;
		idx=0;
		bool ret=true;
		for(int i=1;i<=n;i++)
		{
			int x,y,z;
			
			scanf("%d%d%d",&x,&y,&z);
			x=_get(x),y=_get(y);
			arr.push_back({x,y,z});
		}
		for(int i=1;i<=idx;i++)
		{
			f[i]=i;
		}
		
		for(int i=0;i<arr.size();i++)
		{
			if(arr[i].flg==1)
			{
				int x=arr[i].x;
				int y=arr[i].y;
				x=Find(x);
				y=Find(y);
				f[x]=y;
			}
		}
		for(int i=0;i<arr.size() && ret;i++)
		{
			if(arr[i].flg==0)
			{
				int x=arr[i].x;
				int y=arr[i].y;
				x=Find(x);
				y=Find(y);
				if(x==y)
					ret=false;				
			}
		}
		if(ret)
		{
			cout<<"YES"<<endl;
		}
		else{
			cout<<"NO"<<endl;
		}
		has.clear();
	}
	return 0;
}
